<?php
namespace app;

use ErrorException;
use Exception;
use InvalidArgumentException;
use ParseError;
use PDOException;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\ClassNotFoundException;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\HttpResponseException;
use think\exception\RouteNotFoundException;
use think\exception\ValidateException;
use think\Response;
use Throwable;
use TypeError;

/**
 * 应用异常处理类
 */
class ExceptionHandle extends Handle
{
    /**
     * 不需要记录信息（日志）的异常类列表
     * @var array
     */
    protected $ignoreReport = [
       // HttpException::class,
       // HttpResponseException::class,
       // ModelNotFoundException::class,
       // DataNotFoundException::class,
       // ValidateException::class,
    ];

    public function __construct()
    {
        parent::__construct(app());
    }

    /**
     * 记录异常信息（包括日志或者其它方式记录）
     *
     * @access public
     * @param  Throwable $exception
     * @return void
     */
    public function report(Throwable $e): void
    {

        if (!$this->isIgnoreReport($e)) {
            // 使用内置的方式记录异常日志
            parent::report($e);
            return;
        }
        // 使用内置的方式记录异常日志
        parent::report($e);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @access public
     * @param \think\Request   $request
     * @param Throwable $e
     * @return Response
     */
    public function render($request, Throwable $e): Response
    {
        if (!$this->isIgnoreReport($e)) {

            // 添加自定义异常处理机制
            // 参数验证错误
            if ($e instanceof ValidateException) {
                return json($e->getError(), 400);
            }


            // ajax请求500异常, 不返回错误页面
            if (($e instanceof Exception || $e instanceof PDOException || $e instanceof HttpException || $e instanceof InvalidArgumentException || $e instanceof ErrorException || $e instanceof ParseError || $e instanceof TypeError) && request()->isAjax()) {
                return json(['msg' => env('app_debug') ? $e->getMessage() : '系统异常，请稍后再试', 'code' => 500, 'data' => env('app_debug') ? $e->getTrace() : []]);
            }
            // 内部异常 , 返回错误页面
            if ($e instanceof Exception || $e instanceof PDOException || $e instanceof InvalidArgumentException || $e instanceof ErrorException || $e instanceof ParseError || $e instanceof TypeError || ($e instanceof HttpException && $e->getStatusCode() == 500)) {
                //return view(root_path() . 'public/error/500-2.html', ['e' => $e, 'error_num' => $this->error_num], 500);
                return json(['msg' => env('app_debug') ? $e->getMessage() : '系统异常，请稍后再试', 'code' => 500, 'data' => env('app_debug') ? $e->getTrace() : []]);

            }
        }
        // 其他错误交给系统处理
        return parent::render($request, $e);
    }
}
